package array;

import java.util.Random;

/**什么是数组?
 * 数组是存放在连续内存空间上的相同类型数据的集合
 * 需要注意:
 * 数组的下标都是从0开始的
 * 相同数据类型不是固定死的，要结合隐式转换考虑(向下兼容：范围小/精度低的类型可自动转换为范围大/精度高的类型)
 * 数组内存空间的地址是连续的(因此删除或者添加元素则需要移动其它元素地址)
 * 数组的元素是不能删的，只能覆盖
 */


public class basicKnowledge {
    public static void main(String[] args) {
        //获取随机数:
        //Java帮我们写好了一个类叫做Random,这个类可以随机生成一个随机数
        //步骤:①导包 ②创建对象---表示我要开始用Random这个类了
        Random random = new Random();
        //③生成随机数:---真正开始干活了
        int num = random.nextInt(10);//0~9(包头不包尾，包左不包右)

        //数组的定义和初始化:
        // 静态初始化:数据类型[] 数据名=new 数据类型[]{元素1，元素2};
        int[] arr = new int[]{1,2,3};
        //简写
        int[] arr1 = {1,2,3};
        //动态初始化:数据类型[] 数据名=new 数据类型[元素个数];
        //在创建的时候，由我们自己确定元素个数，由虚拟机给出默认的初始化值
        //数组默认初始化值的规律:
        //整数类型: 默认初始化值为0
        //小数类型: 默认初始化值为0.0
        //字符类型: 默认初始化值为‘\u0000’ 空格
        //布尔类型: 默认初始化值为false
        //引用数据类型: 默认初始化值为null
        int[] arr2 = new int[3];
        test_arr();

        /**数组的内存图:
         * Java内存分配:
         * 栈:方法运行时使用的内存，比如main方法运行，进入方法栈中执行
         * 堆:存储对象或者数组，new来创建的，都存储在堆内存
         * 方法区:存储可以运行的class文件
         * 本地方法栈:JVM在使用操作系统功能的时候使用，和我们的开发无关
         * 寄存器:给CPU使用，和我们的开发无关

         * 两个数组指向同一个空间的内存图:
         * 当两个数组指向同一个小空间时，其中一个数组对小空间中的值发生了改变，
         * 则其它数组再次访问的时候都是修改之后的结果了；
         */
        int[] arr3={1,2,30};
        int[] arr4=arr3;
        System.out.println(arr3[2]);
        System.out.println(arr4[2]);
        arr4[2]=100;
        System.out.println(arr3[2]);
        System.out.println(arr4[2]);

    }

    /**二维数组在内存的空间地址是连续的吗?
     * 是的(地址的数值是16进制)
     *
     */
    public static void test_arr(){
        int[][] arr = {{1,2,3},{4,5,6},{7,8,9}};
        System.out.println(arr[1][1]);

        /**
         * 解释一下地址值的格式含义: [I@4eec7777
         * [: 表示当前是一个数组
         * I: 表示当前数组的元素类型是int
         * @: 表示一个间隔符号，固定格式
         * 4eec7777: 数组在内存中的真正地址值(十六进制)
         * 平时我们习惯将这个整体叫做数组的地址值
         */
        System.out.println(arr[1]);
    }


}
